package com.stefanini.pe.bbva.bp.in.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;
import org.primefaces.event.TabChangeEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import com.pe.bbva.utils.Constantes;
import com.stefanini.pe.bbva.bp.in.bo.datasource.DetallePorContratos;
import com.stefanini.pe.bbva.bp.in.bo.iface.RebalanceoBOIface;
import com.stefanini.pe.bbva.bp.in.model.ListasReporteModel;
import com.stefanini.pe.bbva.bp.in.model.PosicionRebalanceoModel;
import com.stefanini.pe.bbva.bp.in.security.AuthorizationService;
import com.stefanini.pe.bbva.bp.in.to.Cliente;
import com.stefanini.pe.bbva.bp.in.to.ListaGenerica;
import com.stefanini.pe.bbva.bp.in.to.PosicionContrato;
import com.stefanini.pe.bbva.bp.in.to.PosicionDetalle;
import com.stefanini.pe.bbva.bp.in.utils.ConstantesWeb;
import com.stefanini.pe.bbva.bp.in.utils.SpringApplicationContext;
import com.stefanini.pe.bbva.bp.in.utils.Util;

@Controller(value = "posicionRebController")
@RequestScoped
public class PosicionRebalanceoController extends GenericoController{
	@Autowired
	private PosicionRebalanceoModel posicionRebalanceoModel;
	@Autowired  
    @Qualifier("rebalanceoBO")
	private RebalanceoBOIface rebalanceoBO;
	@Autowired
	private ListasReporteModel listaReporteModel;
	
	private String mensajeValidacion;
	private String montoDisponibleSeleccionado;
	private String cantidadContratosSeleccionado;
	private Integer idxTabResult;
	
	public void onPageLoad(ComponentSystemEvent event) {
		try {
			AuthorizationService auth = (AuthorizationService)SpringApplicationContext.getBean("authorizationService");
			if (auth.isSessionClientAndContextValide() && !FacesContext.getCurrentInstance().isPostback()) {
				System.out.println("PosicionRebalanceoController... is not Postback");
				
				idxTabResult = 0;
				this.posicionRebalanceoModel.setSelectAllProductosRebalanceado(false);
				inicializaListas();
				getSessionMap().put(ConstantesWeb.Reportes.PARAM_NOMBRE_REPORTE,ConstantesWeb.Reportes.REPORTE_POSICION_ACTIVO_CONTRATOS);
				getSessionMap().put(ConstantesWeb.Reportes.FLAG_REPORTE_POSITION_ACTIVO,ConstantesWeb.Reportes.FLAG_REBALANCEO);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void inicializaListas() {
		this.posicionRebalanceoModel.setListaContratoProductos(new ArrayList());
		this.posicionRebalanceoModel.setListaDetalleProductos(new ArrayList());
		this.posicionRebalanceoModel.setRebalanceoContratoTotal(new PosicionContrato());
		this.posicionRebalanceoModel.setRebalanceoDetalleTotal(new PosicionDetalle());
		this.posicionRebalanceoModel.setListaContratoProductosRebalanceado(new ArrayList());
		this.posicionRebalanceoModel.setListaDetalleProductosRebalanceado(new ArrayList());
		this.posicionRebalanceoModel.setRebalanceoContratoTotalRebalanceado(new PosicionContrato());
		this.posicionRebalanceoModel.setRebalanceoDetalleTotalRebalanceado(new PosicionDetalle());
		Cliente cliente=(Cliente)getSession().getAttribute(Constantes.OBJETO_CLIENTE_SESSION);
		
		//Fixed tab Contratos
		List listaContratoProductos1 = new ArrayList();
		rebalanceoBO.listarPosicionContrato(cliente.getCodcliente(),this.posicionRebalanceoModel.getRebalanceoContratoTotal(),listaContratoProductos1);
		List<PosicionContrato> listTempPosContrato = new ArrayList<PosicionContrato>();
		for(int i=0; i<listaContratoProductos1.size(); i++){
			ListaGenerica listaGenerica = (ListaGenerica)listaContratoProductos1.get(i);
			PosicionContrato obj = (PosicionContrato)listaGenerica.getObj();
			if(listaGenerica.getSubLista().size() > 0){
				for(int j=0; j<listaGenerica.getSubLista().size(); j++){
					PosicionContrato obRowSubLista = (PosicionContrato)listaGenerica.getSubLista().get(j);
					if(obRowSubLista != null && obj != null){
						obRowSubLista.setOpcionNoDepositos(obj.isOpcionNoDepositos());
						obRowSubLista.setOpcionCuentasPersonales(obj.isOpcionCuentasPersonales());
						obRowSubLista.setOpcionFondosMutuos(obj.isOpcionFondosMutuos());
						obRowSubLista.setOpcionValores(obj.isOpcionValores());
						listTempPosContrato.add(obRowSubLista);
					}
				}
			}
			if(obj != null){
				obj.setShowIsDataFooter(true);
				listTempPosContrato.add(obj);
			}
		}
		this.posicionRebalanceoModel.setListaContratoProductos(listTempPosContrato);
		
		//Fixed tab Detalle
		List listaDetalleProductos1 = new ArrayList();
		rebalanceoBO.listarPosicionDetalle(cliente.getCodcliente(), this.posicionRebalanceoModel.getRebalanceoDetalleTotal(),
											listaDetalleProductos1);
		List<PosicionDetalle> listTempPosDetalle = new ArrayList<PosicionDetalle>();
		for(int i=0; i<listaDetalleProductos1.size(); i++){
			ListaGenerica listaGenerica = (ListaGenerica)listaDetalleProductos1.get(i);
			PosicionDetalle obj = (PosicionDetalle)listaGenerica.getObj();
			if(listaGenerica.getSubLista().size() > 0){
				for(int j=0; j<listaGenerica.getSubLista().size(); j++){
					PosicionDetalle obRowSubLista = (PosicionDetalle)listaGenerica.getSubLista().get(j);
					if(obRowSubLista != null && obj != null){
						obRowSubLista.setTasa(Util.formatDouble3Special(obRowSubLista.getTasa()));
						obRowSubLista.setPrecioactual(Util.formatDouble3Special(obRowSubLista.getPrecioactual()));
						obRowSubLista.setPreciocompra(Util.formatDouble3Special(obRowSubLista.getPreciocompra()));
						listTempPosDetalle.add(obRowSubLista);
					}
				}
			}
			if(obj != null){
				obj.setShowIsDataFooter(true);
				listTempPosDetalle.add(obj);
			}
		}
		this.posicionRebalanceoModel.setListaDetalleProductos(listTempPosDetalle);

		this.obtenerListaRepPosActiContrato(posicionRebalanceoModel.getListaContratoProductos());
		this.obtenerListaRepPosActiDetalle(posicionRebalanceoModel.getListaDetalleProductos());
	}
	
	public void onTabChange(TabChangeEvent event) {
		if(idxTabResult == 0){
			getSessionMap().put(ConstantesWeb.Reportes.PARAM_NOMBRE_REPORTE,ConstantesWeb.Reportes.REPORTE_POSICION_ACTIVO_CONTRATOS);
		}else if(idxTabResult == 1){
			HashMap mapIndicadores=new HashMap();
			if(this.posicionRebalanceoModel.getListaContratoProductos()!=null){
				for (Iterator iter = this.posicionRebalanceoModel.getListaContratoProductos().iterator(); iter.hasNext();) {
					PosicionContrato pc = (PosicionContrato)iter.next();
					if(!pc.isShowIsDataFooter()){
						if(pc.getCodcontrato()!=null){
							mapIndicadores.put(pc.getCodcontrato(), pc.isIndparticiparebalanceo());
						}
						pc.setStrparticiparebalanceo(pc.isIndparticiparebalanceo()?"S":"N");
					}
				}
				this.posicionRebalanceoModel.setListaContratoProductos(obtenerIndicadorRebalanceoContrato(this.posicionRebalanceoModel.getListaContratoProductos()));
			}

			List listaDetalleProductos_aux=new ArrayList();
			if(this.posicionRebalanceoModel.getListaDetalleProductos()!=null){
				for (Iterator iter = this.posicionRebalanceoModel.getListaDetalleProductos().iterator(); iter.hasNext();) {
					PosicionDetalle pd = (PosicionDetalle) iter.next();
					if(!pd.isShowIsDataFooter()){
						if(pd.getIdcontratodetalle()!=null){
							if(mapIndicadores.get(Util.formatContrato(pd.getIdcontratodetalle()))!=null){
								if(new Boolean(mapIndicadores.get(Util.formatContrato(pd.getIdcontratodetalle().toString())).toString())){
									pd.setIndparticiparebalanceo(true);
								}else{
									pd.setIndparticiparebalanceo(false);
								}
							}
							pd.setCodcontratoF(Util.formatContrato(pd.getIdcontratodetalle()));
							pd.setStrparticiparebalanceo(pd.isIndparticiparebalanceo()?"S":"N");
						}
					}
					listaDetalleProductos_aux.add(pd);
				}
			}
			this.posicionRebalanceoModel.setListaDetalleProductos(listaDetalleProductos_aux);
			
			this.obtenerListaRepPosActiContrato(posicionRebalanceoModel.getListaContratoProductos());
			this.obtenerListaRepPosActiDetalle(posicionRebalanceoModel.getListaDetalleProductos());
			getSessionMap().put(ConstantesWeb.Reportes.PARAM_NOMBRE_REPORTE,ConstantesWeb.Reportes.REPORTE_POSICION_ACTIVO_DETALLE);
		}
	}
	
	public void verificaListener(){
		RequestContext context = RequestContext.getCurrentInstance();
		boolean mostrarMensajeConfirmacion = false;
		try{
			StringBuilder contratos=new StringBuilder();
			Double saldoDisponibleParticipa=new Double(0);
			int contadorContratos=0;
			if(posicionRebalanceoModel.getListaContratoProductos()!=null){
				for (Iterator iter = posicionRebalanceoModel.getListaContratoProductos().iterator(); iter.hasNext();) {
					PosicionContrato pc = (PosicionContrato) iter.next();
					if(!pc.isShowIsDataFooter()){
						if(pc.getIdcontrato()!=null){
							if(pc.isIndparticiparebalanceo()){
								saldoDisponibleParticipa+=Util.isNumberFormat(pc.getSaldoactualext());
								contadorContratos++;
								contratos.append(Util.unFormatContrato(pc.getCodcontrato()));
								contratos.append(",");
							}
						}
					}
				}
			}
			
			if(contratos.length()>0){
				this.setCantidadContratosSeleccionado(""+contadorContratos);
				this.setMontoDisponibleSeleccionado(Util.formatDouble(saldoDisponibleParticipa));
				Cliente cliente=(Cliente)getSession().getAttribute(Constantes.OBJETO_CLIENTE_SESSION);
				cliente.setNrocontratosrebalanceo(contratos.substring(0, contratos.length()-1).toString());
				getSession().setAttribute(Constantes.OBJETO_CLIENTE_SESSION, cliente);
				this.setMensajeValidacion("");
				mostrarMensajeConfirmacion = true;
			}
			else{ 
				this.setCantidadContratosSeleccionado("0");
				this.setMontoDisponibleSeleccionado("0");
				this.setMensajeValidacion(Util.leerConfig("MensajeRebalanceoSinChk"));
				mostrarMensajeConfirmacion = false;
			}
		}catch(Exception e){
			e.printStackTrace();
			mostrarMensajeConfirmacion = false;
			this.setMensajeValidacion("Error interno.");
		}
		context.addCallbackParam("isPopupConfirmacion", mostrarMensajeConfirmacion);
	}

	public String getMensajeValidacion() {
		return mensajeValidacion;
	}

	public void setMensajeValidacion(String mensajeValidacion) {
		this.mensajeValidacion = mensajeValidacion;
	}

	public String getCantidadContratosSeleccionado() {
		return cantidadContratosSeleccionado;
	}

	public void setCantidadContratosSeleccionado(
			String cantidadContratosSeleccionado) {
		this.cantidadContratosSeleccionado = cantidadContratosSeleccionado;
	}

	public String getMontoDisponibleSeleccionado() {
		return montoDisponibleSeleccionado;
	}

	public void setMontoDisponibleSeleccionado(String montoDisponibleSeleccionado) {
		this.montoDisponibleSeleccionado = montoDisponibleSeleccionado;
	}
	
	public void obtenerListaRepPosActiContrato(List listaContratoProductos){
		List<DetallePorContratos> listarDetalleContrato=new ArrayList<DetallePorContratos>();
		DetallePorContratos detallePorContratos=null;
		List<PosicionContrato> listPC = new ArrayList<PosicionContrato>();
		List<PosicionContrato> listaTotal=new ArrayList<PosicionContrato>();
		for (int i=0;i< listaContratoProductos.size();i++) {
			PosicionContrato pc = (PosicionContrato)listaContratoProductos.get(i);
			detallePorContratos=new DetallePorContratos();
			
			if(!pc.isShowIsDataFooter()){
				listPC.add(pc);
			}else{
				listaTotal.add(pc);
				if(i==listaContratoProductos.size()-1){
					listaTotal.add(this.posicionRebalanceoModel.getRebalanceoContratoTotal());
				}
				//guardar
				detallePorContratos.setListaDetalle(listPC);
				detallePorContratos.setTotal(listaTotal);
				listarDetalleContrato.add(detallePorContratos);
				//inicializar
				listPC = new ArrayList<PosicionContrato>();
				listaTotal=new ArrayList<PosicionContrato>();
			}
		}
		listaReporteModel.setListaReportePosicionContratos(listarDetalleContrato);
	}
	
	public void obtenerListaRepPosActiDetalle(List listaDetalleProductos){
		List<DetallePorContratos> listarDetalleContrato=new ArrayList<DetallePorContratos>();
		DetallePorContratos detallePorContratos=null;
		List<PosicionDetalle> listPD = new ArrayList<PosicionDetalle>();
		List<PosicionDetalle> listaTotal=new ArrayList<PosicionDetalle>();
		for (int i=0;i< listaDetalleProductos.size();i++) {
			PosicionDetalle pd = (PosicionDetalle)listaDetalleProductos.get(i);
			detallePorContratos=new DetallePorContratos();
			
			if(!pd.isShowIsDataFooter()){
				if(pd.getIdcontratodetalle()!=null){
					pd.setCodcontratoF(Util.formatContrato(pd.getIdcontratodetalle()));
					pd.setStrparticiparebalanceo(pd.isIndparticiparebalanceo()?"S":"N");
				}
				listPD.add(pd);
			}else{
				listaTotal.add(pd);
				if(i==listaDetalleProductos.size()-1){
					listaTotal.add(this.posicionRebalanceoModel.getRebalanceoDetalleTotal());
				}
				//guardar
				detallePorContratos.setListaDetalle(listPD);
				detallePorContratos.setTotal(listaTotal);
				listarDetalleContrato.add(detallePorContratos);
				//inicializar
				listPD = new ArrayList<PosicionDetalle>();
				listaTotal=new ArrayList<PosicionDetalle>();
			}	
		}
		listaReporteModel.setListaReportePosicionDetalle(listarDetalleContrato);			
	}
	
	public List<PosicionContrato> obtenerIndicadorRebalanceoContrato(List<PosicionContrato> lista){
			
		for (int i=0;i<lista.size(); i++) {
			PosicionContrato pc = (PosicionContrato) lista.get(i);
			if(!pc.isShowIsDataFooter()){
				pc.setStrparticiparebalanceo(pc.isIndparticiparebalanceo()?"S":"N");
				lista.set(i, pc);
			}
		}
		return lista;
	}

	public void capturarIdsProductosTodos() {
		try {
			boolean band = posicionRebalanceoModel.isSelectAllProductosRebalanceado();
			if (band) {
				if (posicionRebalanceoModel.getListaContratoProductos() != null && posicionRebalanceoModel.getListaContratoProductos().size() > 0) {
					
					this.posicionRebalanceoModel.setListaIdsPosicionContratos(null);
					List<PosicionContrato> lstDTOSession = new ArrayList<PosicionContrato>();
					
					for (Object obj : posicionRebalanceoModel.getListaContratoProductos()) {					
						ListaGenerica objLG = (ListaGenerica) obj;
						if (objLG.getSubLista().size()>0){
							for (Object objSL : objLG.getSubLista()) {
								((PosicionContrato) objSL).setIndparticiparebalanceo(true);
								lstDTOSession.add(((PosicionContrato) objSL));
							}
						}
					}
					posicionRebalanceoModel.setListaIdsPosicionContratos(lstDTOSession); 
				}
			} else {
				if (posicionRebalanceoModel.getListaContratoProductos() != null && posicionRebalanceoModel.getListaContratoProductos().size() > 0) {
					for (Object obj : posicionRebalanceoModel.getListaContratoProductos()) {
						ListaGenerica objLG = (ListaGenerica) obj;
						
						if (objLG.getSubLista().size()>0){
							for (Object objSL : objLG.getSubLista()) {
								((PosicionContrato) objSL).setIndparticiparebalanceo(false);
							}
						}
					}
					posicionRebalanceoModel.setListaIdsPosicionContratos(null);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void capturarIdsProductos() {
			this.posicionRebalanceoModel.setSelectAllProductosRebalanceado(false);
	}
	
	public Integer getIdxTabResult() {
		return idxTabResult;
	}

	public void setIdxTabResult(Integer idxTabResult) {
		this.idxTabResult = idxTabResult;
	}

	public void rebalancearSituacionActual(){
		Util.redirect("/pages/asesoria/situacionParaRebalancear.xhtml");
	}

	/******************   ******************/	
	private HttpSession getSession(){
		FacesContext context = FacesContext.getCurrentInstance();
		return (HttpSession)context.getExternalContext().getSession(false);
	}
	/******************   ******************/
}
